home *** CD-ROM | disk | FTP | other *** search
/ Collection of Tools & Utilities / Collection of Tools and Utilities.iso / ada / gwuada_8.zip / DOC.ZIP / PARSER.ADA < prev    next >
Text File  |  1993-08-17  |  4KB  |  137 lines

  1. --
  2. --    Program : Parser.ada
  3. --    Purpose : This program implements a recursive descent parser.  It is
  4. -        based on the recursive descent parser given in Aho, Sethi,
  5. --        and Ullman, "Principles, Techniques and Tools", 
  6. --        Addison-Wesley, 1986.  Note that symbols are limited to
  7. --        a single character.
  8. --
  9. --    To use with GWUMON : To use this program with GWUMON, from the command
  10. --              line type:
  11. --                       adacomp -a -b -mparse_expr parser.ada
  12. --                       gwumon -mparse_expr
  13. --
  14. --    Take the default options on the first screen (speed = 6, exceptions = yes,
  15. --              and tasks = no) by hitting the "Esc" key.  Take the defaults
  16. --        on the second screen by hitting the "Esc" key.
  17. --
  18. --    The purpose of this program is to show recursion, and how in showing that
  19. --    recursion the parse tree can be represented.
  20. --
  21. WITH Text_IO; USE Text_IO;
  22. PACKAGE Parser IS
  23.         PROCEDURE Lex;
  24.         PROCEDURE Expr;
  25.         PROCEDURE Factor;
  26.         PROCEDURE Parse;
  27.         PROCEDURE Term;
  28. PRIVATE
  29.         Token : CHARACTER;
  30.         Token_Type : CHARACTER;
  31. END;
  32.  
  33. PACKAGE BODY Parser IS
  34.  
  35.     PROCEDURE Lex IS
  36.     BEGIN
  37.         LOOP
  38.             IF NOT End_Of_Line THEN
  39.                 GET( Token );
  40.                 IF Token /= ' ' THEN
  41.                     CASE Token IS
  42.                         WHEN '+' | '-' =>
  43.                             Token_Type := 'A';
  44.                         WHEN '*' | '/' =>
  45.                             Token_Type := 'M';
  46.                         WHEN OTHERS =>
  47.                             Token_Type := 'I';
  48.                     END CASE;
  49.                 EXIT;
  50.                 END IF;
  51.             ELSE
  52.                 Token_Type := ' ';
  53.         Token := ' ';
  54.                 EXIT;
  55.             END IF;
  56.         END LOOP;
  57.     END Lex;
  58.  
  59.     PROCEDURE Factor IS
  60.         Save_Token : CHARACTER;
  61.     BEGIN
  62.         IF Token = '(' THEN
  63.             Lex;
  64.             Expr;
  65.             IF Token /= ')' THEN
  66.                     PUT_LINE(" ");
  67.                     PUT_LINE( "Error, ')' expected, tossing token" );
  68.             ELSE
  69.                 Lex;
  70.             END IF;
  71.         ELSE 
  72.             IF Token_Type = 'I' THEN
  73.                 PUT( Token );
  74.                 Lex;
  75.             ELSE
  76.                 PUT_LINE(" ");
  77.                 PUT( "Error, identifier expected, got ");
  78.                 PUT( Token );
  79.                 New_Line;
  80.             END IF;
  81.         END IF;
  82.  
  83.     END Factor;
  84.  
  85.     PROCEDURE Term IS
  86.         Save_Token : CHARACTER;
  87.     BEGIN
  88.         Factor;
  89.         LOOP
  90.             IF Token = '*' OR Token = '/' THEN
  91.                 Save_Token := Token;
  92.                 Lex;
  93.                 Factor;
  94.                 PUT( Save_Token );
  95.             ELSE
  96.                 Exit;
  97.             END IF;
  98.         END LOOP;
  99.     END TERM;
  100.  
  101.         
  102.     PROCEDURE Parse IS
  103.     BEGIN
  104.         Lex;
  105.         Expr;
  106.     END Parse;
  107.     
  108.     PROCEDURE Expr IS
  109.         Save_Token : CHARACTER;
  110.     BEGIN
  111.         Term;
  112.         LOOP
  113.             IF Token = '+' OR Token = '-' THEN
  114.                 Save_Token := Token;
  115.                 Lex;
  116.                 Term;
  117.                 PUT( Save_Token );        
  118.             ELSE
  119.                 EXIT;
  120.             END IF;
  121.         END LOOP;
  122.     END Expr;
  123.  
  124. END Parser;
  125.  
  126.  
  127. WITH Text_IO; USE Text_IO;
  128. WITH Parser; USE Parser;
  129. PROCEDURE Parse_Expr IS
  130. BEGIN
  131.  
  132.     PUT_LINE( "Enter an equation to be parsed " );
  133.         Parse;
  134.  
  135. END Parse_Expr;
  136.  
  137.